package cn.jly.boot.mp.controller;

import cn.jly.boot.mp.bean.User;
import cn.jly.boot.mp.mapper.UserMapper;
import cn.jly.boot.mp.utils.QueryCondition;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author lanyangji
 * @Api：用在请求的类上，表示对类的说明 tags="说明该类的作用，可以在UI界面上看到的注解"
 * value="该参数没什么意义，在UI界面上也看到，所以不需要配置"
 * @ApiOperation：用在请求的方法上，说明方法的用途、作用 value="说明方法的用途、作用"
 * notes="方法的备注说明"
 * @ApiImplicitParams：用在请求的方法上，表示一组参数说明
 * @ApiImplicitParam：用在@ApiImplicitParams注解中，指定一个请求参数的各个方面 name：参数名
 * value：参数的汉字说明、解释
 * required：参数是否必须传
 * paramType：参数放在哪个地方
 * · header --> 请求参数的获取：@RequestHeader
 * · query --> 请求参数的获取：@RequestParam
 * · path（用于restful接口）--> 请求参数的获取：@PathVariable
 * · div（不常用）
 * · form（不常用）
 * dataType：参数类型，默认String，其它值dataType="Integer"
 * defaultValue：参数的默认值
 * @ApiResponses：用在请求的方法上，表示一组响应
 * @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息 code：数字，例如400
 * message：信息，例如"请求参数没填好"
 * response：抛出异常的类
 * @ApiModel：用于响应类上，表示一个返回响应数据的信息 （这种一般用在post创建的时候，使用@RequestBody这样的场景，
 * 请求参数无法使用@ApiImplicitParam注解进行描述的时候）
 * @ApiModelProperty：用在属性上，描述响应类的属性
 * @description userController
 * @date 2020/12/25 下午 4:25
 */
@Api(tags = "用户信息控制器")
@Controller
public class UserController {

    @Autowired
    UserMapper userMapper;

    /**
     * 请求体
     * {
     *      "page": 1,
     *      "size": 10,
     *      "queryEntity": {
     *          "username": "岚"
     *      }
     * }
     *
     * @param queryCondition
     * @return
     */
    @ApiImplicitParams(
            value = {
                    @ApiImplicitParam(
                            name = "page",
                            value = "页码",
                            required = false,
                            paramType = "query"
                    ),
                    @ApiImplicitParam(
                            name = "size",
                            value = "每页记录数",
                            required = false,
                            paramType = "query"
                    ),
                    @ApiImplicitParam(
                            name = "user",
                            value = "查询条件",
                            required = false,
                            paramType = "query"
                    )
            }
    )
    @ApiOperation(value = "分页查询用户")
    @GetMapping("/users")
    @ResponseBody
    public Page<User> getByPage(@RequestBody QueryCondition<User> queryCondition) {
        final User user = queryCondition.getQueryEntity();
        return userMapper.selectPage(
                new Page<>(queryCondition.getPage(), queryCondition.getSize()),
                ObjectUtils.isEmpty(user) ? null : Wrappers.<User>lambdaQuery()
                        .eq(ObjectUtils.isNotEmpty(user.getId()), User::getId, user.getId())
                        .like(StringUtils.isNotBlank(user.getUsername()), User::getUsername, user.getUsername())
                        .like(StringUtils.isNotBlank(user.getEmail()), User::getEmail, user.getEmail())
        );
    }
}
